{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Langgraph4j to PlantUML diagram"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "var userHomeDir = System.getProperty(\"user.home\");\n",
    "var localRespoUrl = \"file://\" + userHomeDir + \"/.m2/repository/\";\n",
    "var langgraph4jVersion = \"1.6-SNAPSHOT\";"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%bash \n",
    "rm -rf \\{userHomeDir}/Library/Jupyter/kernels/rapaio-jupyter-kernel/mima_cache/org/bsc/langgraph4j"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%dependency /add-repo local \\{localRespoUrl} release|never snapshot|always\n",
    "// %dependency /list-repos\n",
    "%dependency /add org.slf4j:slf4j-jdk14:2.0.9\n",
    "%dependency /add org.bsc.langgraph4j:langgraph4j-core:\\{langgraph4jVersion}\n",
    "%dependency /add net.sourceforge.plantuml:plantuml-mit:1.2025.3\n",
    "\n",
    "%dependency /resolve"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Utility to render graph respresentation in PlantUML**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "import net.sourceforge.plantuml.SourceStringReader;\n",
    "import net.sourceforge.plantuml.FileFormatOption;\n",
    "import net.sourceforge.plantuml.FileFormat;\n",
    "import org.bsc.langgraph4j.GraphRepresentation;\n",
    "\n",
    "void displayDiagram( String diagram ) throws IOException { \n",
    "    \n",
    "    var reader = new SourceStringReader(diagram);\n",
    "\n",
    "    try(var imageOutStream = new java.io.ByteArrayOutputStream()) {\n",
    "\n",
    "        var description = reader.outputImage( imageOutStream, 0, new FileFormatOption(FileFormat.PNG));\n",
    "\n",
    "        var imageInStream = new java.io.ByteArrayInputStream(  imageOutStream.toByteArray() );\n",
    "\n",
    "        var image = javax.imageio.ImageIO.read( imageInStream );\n",
    "\n",
    "        display(  image );\n",
    "\n",
    "    }\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "var code = \"\"\"\n",
    "        @startuml\n",
    "        title my first diagram\n",
    "        A --> B\n",
    "        @enduml\n",
    "        \"\"\";\n",
    "\n",
    "displayDiagram( code );\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Langgraph4j workflow to PlantUML diagram"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import org.bsc.langgraph4j.StateGraph;\n",
    "import org.bsc.langgraph4j.state.AgentState;\n",
    "import org.bsc.langgraph4j.utils.EdgeMappings;\n",
    "import static org.bsc.langgraph4j.StateGraph.END;\n",
    "import static org.bsc.langgraph4j.StateGraph.START;\n",
    "import static org.bsc.langgraph4j.action.AsyncEdgeAction.edge_async;\n",
    "import static org.bsc.langgraph4j.action.AsyncNodeAction.node_async;\n",
    "import java.util.Map;\n",
    "\n",
    "\n",
    "var workflow = new StateGraph<>( AgentState::new )\n",
    "        .addNode( \"supervisor\", node_async(state -> Map.of()))\n",
    "        .addNode( \"coder\", node_async(state -> Map.of()) )\n",
    "        .addNode( \"researcher\",node_async(state -> Map.of()) )\n",
    "        .addEdge( START, \"supervisor\")\n",
    "        .addConditionalEdges( \"supervisor\",\n",
    "                edge_async( state -> \"FINISH\" ), \n",
    "                EdgeMappings.builder()\n",
    "                        .to( \"coder\" )\n",
    "                        .to( \"researcher\")\n",
    "                        .toEND( \"FINISH\")\n",
    "                        .build())\n",
    "        .addEdge( \"coder\", \"supervisor\")\n",
    "        .addEdge( \"researcher\", \"supervisor\")\n",
    "        ;\n",
    "\n",
    "displayDiagram( workflow.getGraph( GraphRepresentation.Type.PLANTUML, \"Supervisor Diagram\", false ).content() );\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Java (rjk 2.2.0)",
   "language": "java",
   "name": "rapaio-jupyter-kernel"
  },
  "language_info": {
   "codemirror_mode": "java",
   "file_extension": ".jshell",
   "mimetype": "text/x-java-source",
   "name": "java",
   "nbconvert_exporter": "script",
   "pygments_lexer": "java",
   "version": "22.0.2+9-70"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
